package cn.sys.service.impl;

import cn.sys.domain.Menu;
import cn.sys.domain.Role;
import cn.sys.domain.TreeNode;
import cn.sys.mapper.MenuMapper;
import cn.sys.mapper.RoleMapper;
import cn.sys.service.RoleService;
import cn.sys.utils.DataGridView;
import cn.sys.vo.RoleVo;
import com.github.pagehelper.Page;
import com.github.pagehelper.PageHelper;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.ArrayList;
import java.util.List;

/**
 * @author Mxb
 * @version 1.0
 * @date 2019/10/30 15:49
 */
@Service
public class RoleServiceImpl implements RoleService {

    @Autowired
    private RoleMapper roleMapper;
    @Autowired
    private MenuMapper menuMapper;

    /*查询所有 角色*/
    public DataGridView queryAllRole(RoleVo roleVo) {
        Page<Object> page = PageHelper.startPage(roleVo.getPage(), roleVo.getLimit());
        List<Role> data = this.roleMapper.queryAllRole(roleVo);
        return new DataGridView(page.getTotal(), data);
    }

    //    添加角色
    @Override
    public void addRole(RoleVo roleVo) {
        this.roleMapper.insertSelective(roleVo);
    }

    //    修改角色
    @Override
    public void updateRole(RoleVo roleVo) {
        this.roleMapper.updateByPrimaryKeySelective(roleVo);
    }

    //    根据id删除角色
    @Override
    public void deleteRole(Integer roleId) {
        //删除角色表的数据
        this.roleMapper.deleteByPrimaryKey(roleId);
//        根据角色id删除sys_role_role表中的数据
        this.roleMapper.deleteRoleMenuByRid(roleId);
//        根据角色id删除sys_role_user中数据
        this.roleMapper.deleteRoleUserByRid(roleId);
    }

    //    批量删除角色
    @Override
    public void deleteBatchRole(Integer[] ids) {
        for (Integer rid : ids) {
            deleteRole(rid);
        }
    }
    //  加载角色管理分配菜单的json
    @Override
    public DataGridView initRoleMenuTreeJson(Integer roleid) {
//        查询所有可用的菜单
        Menu menu = new Menu();
        menu.setAvailable(1);
        List<Menu> menus = menuMapper.queryAllMenu(menu);

//        根据角色id查询当前角色拥有的菜单
        List<Menu> roleMenu = menuMapper.queryMenuByRoleId(1, roleid);

        List<TreeNode> data = new ArrayList<>();
        for(Menu m1:menus){
            // 判断 是否选中
            String checkArr = 0 + "";
            for(Menu m2 :roleMenu){
                if(m1.getId()==m2.getId()){
                    checkArr = 1+"";
                    break;
                }
            }
            Integer id = m1.getId();
            Integer pid = m1.getPid();
            String title =m1.getTitle();
            Boolean spread = m1.getSpread() == 1?true:false;
            data.add(new TreeNode(id,pid,title,spread,checkArr));

        }
        return new DataGridView(data);

    }

    //保存角色 和菜单的关系
    @Override
    public void saveRoleMenu(RoleVo roleVo) {
        Integer rid = roleVo.getRoleid();
        Integer[] mids = roleVo.getIds();

        //根据id删除sys_role_menu 里面的数据
        this.roleMapper.deleteRoleMenuByRid(rid);

        // 保存角色和菜单的关系
        for(Integer mid : mids){
            this.roleMapper.insertRoleMenu(rid,mid);
        }

    }
}
